#ifndef __UART_RINGBUFFER_H__
#define __UART_RINGBUFFER_H__

#include "stdint.h"
#include "stdbool.h"

#ifdef __cplusplus
extern "C" {
#endif

// 环形缓冲区结构体
typedef struct {
    uint8_t *buffer;        // 缓冲区指针
    uint16_t size;          // 缓冲区大小 建议大小是2的幂数
    volatile uint16_t head; // 头指针
    volatile uint16_t tail; // 尾指针
    volatile uint16_t count; // 当前数据量
    volatile uint16_t overflow_count; // 溢出计数
    bool is_dma_mode;       // 是否DMA模式
} uart_ringbuffer_t;

// 初始化环形缓冲区
void uart_ringbuffer_init(uart_ringbuffer_t *rb, uint8_t *buffer, uint16_t size);

// 安全写入数据
uint16_t uart_ringbuffer_write(uart_ringbuffer_t *rb, const uint8_t *data, uint16_t len);

// 安全读取数据
uint16_t uart_ringbuffer_read(uart_ringbuffer_t *rb, uint8_t *data, uint16_t len);

// 检查缓冲区中可用数据量
uint16_t uart_ringbuffer_available(const uart_ringbuffer_t *rb);

// 检查缓冲区是否为空
bool uart_ringbuffer_is_empty(const uart_ringbuffer_t *rb);

// 检查缓冲区是否已满
bool uart_ringbuffer_is_full(const uart_ringbuffer_t *rb);

// 重置环形缓冲区
void uart_ringbuffer_reset(uart_ringbuffer_t *rb);

// 获取溢出计数
uint16_t uart_ringbuffer_get_overflow_count(const uart_ringbuffer_t *rb);

#ifdef __cplusplus
}
#endif

#endif // __UART_RINGBUFFER_H__